package manejador;

import interfaz.IEntidad;
import interfaz.IManejador;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import persistencia.Conexion;
import entidad.Curso;

public class ManejadorDeCurso implements IManejador {
	private ResultSet rs = null;
	private PreparedStatement stmt = null;
	private static ManejadorDeCurso instancia = null;
	private Curso curso = null;
	private List<IEntidad> cursos = null;
	private Conexion conexion = null;
	private List<Boolean> seleccionCursosActivosNoInscritosPorEstudiante = null;
	private List<Boolean> seleccionCursosInscritosEstudiante = null;
	List<Integer> idCursos = null;
	private int cantidadCurso = 0;
	private boolean isPrimera = true;

	private ManejadorDeCurso() {

		conexion = Conexion.getInstancia();
	}

	public static ManejadorDeCurso getInstancia() {
		if (instancia == null) {
			instancia = new ManejadorDeCurso();
		}
		return instancia;
	}

	@Override
	public int agregar(IEntidad entidad) {
		int fila = 0;
		curso = (Curso) entidad;
		String sql = "INSERT INTO sistema_informacion.curso (nombre, descripcion, id_empleado, estatus)VALUES( ?, ?, ?, ?);";
		stmt = conexion.hacerEnunciado(sql);

		try {
			stmt.setString(1, curso.getNombre());
			stmt.setString(2, curso.getDescripcion());
			stmt.setInt(3, curso.getIdEmpleado());
			stmt.setString(4, curso.getEstatus());
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return fila;
	}

	@Override
	public int eliminar(int id) {
		int fila = 0;
		String sql = "DELETE FROM sistema_informacion.curso WHERE id_curso = ?;";
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setInt(1, id);
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return fila;
	}

	public int getCantidadCurso() {
		int cantidadCurso = 0;
		String sql = "SELECT * FROM curso_estudiante;";
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				cantidadCurso += 1;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return cantidadCurso;
	}

	@Override
	public IEntidad getEntidadPorId(int id) {
		String sql = "SELECT * FROM sistema_informacion.curso WHERE id_curso ="
				+ id;
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				curso = new Curso(rs.getInt("id_curso"),
						rs.getString("nombre"), rs.getString("descripcion"), rs
								.getInt("id_empleado"),
						rs.getString("estatus"), rs.getInt("id_ciclo"));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return curso;
	}

	@Override
	public int modificar(IEntidad entidad, int id) {
		int fila = 0;
		curso = (Curso) entidad;
		String sql = "UPDATE sistema_informacion.curso SET nombre = ? , descripcion = ? , id_empleado = ? , estatus = ? WHERE id_curso = ?;";
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setString(1, curso.getNombre());
			stmt.setString(2, curso.getDescripcion());
			stmt.setInt(3, curso.getIdEmpleado());
			stmt.setString(4, curso.getEstatus());
			stmt.setInt(5, id);
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return fila;
	}

	public List<IEntidad> getEntidadDinamica(String parametro) {
		cursos = new ArrayList<IEntidad>();
		String sql = "";
		if (parametro.equals("ACTIVO")) {
			sql = "SELECT * FROM sistema_informacion.curso WHERE estatus="
					+ "'" + parametro + "'";

		} else if (parametro.equals("INACTIVO")) {
			sql = "SELECT * FROM sistema_informacion.curso WHERE estatus="
					+ "'" + parametro + "'";

		} else if (parametro.equals("TODOS")) {
			sql = "SELECT * FROM sistema_informacion.curso";
		}

		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);

		try {
			while (rs.next()) {
				IEntidad curso = new Curso(rs.getInt("id_curso"), rs
						.getString("nombre"), rs.getString("descripcion"), rs
						.getInt("id_empleado"), rs.getString("estatus"), rs
						.getInt("id_ciclo"));
				cursos.add(curso);

			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return cursos;
	}

	public int cambiarEstatus(int id) {
		int fila = 0;
		curso = (Curso) ManejadorDeCurso.getInstancia().getEntidadPorId(id);
		String estatus = curso.getEstatus().equalsIgnoreCase("ACTIVO") ? "INACTIVO"
				: "ACTIVO";
		String sql = "UPDATE curso SET estatus=? WHERE id_curso=" + id;
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setString(1, estatus);
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return fila;
	}

	public List<IEntidad> getCursosActivosNoInscritosPorEstudiante(
			int idEstudiante) {
		cursos = new ArrayList<IEntidad>();
		seleccionCursosActivosNoInscritosPorEstudiante = new ArrayList<Boolean>();
		/*
		 * this.getCursosEstudiantes(idEstudiante); esto era para que viniera
		 * con los checbox seleccionado en el Jtable
		 */

		cantidadCurso = this.getCantidadCurso();
		if (cantidadCurso == 0) {
			isPrimera = true;
		} else {
			isPrimera = false;
		}
		String sql = "";

		if (isPrimera == true) {
			sql = "SELECT * FROM sistema_informacion.curso";

		} else {
			sql = "SELECT curso.* FROM curso, curso_estudiante, estudiante WHERE curso.id_curso NOT IN (SELECT id_curso FROM curso_estudiante WHERE id_estudiante = "
					+ idEstudiante + " )GROUP BY curso.id_curso;";
		}

		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);

		try {
			while (rs.next()) {
				seleccionCursosActivosNoInscritosPorEstudiante.add(false);

				IEntidad curso = new Curso(rs.getInt("id_curso"), rs
						.getString("nombre"), rs.getString("descripcion"), rs
						.getInt("id_empleado"), rs.getString("estatus"), rs
						.getInt("id_ciclo"));

				cursos.add(curso);

			}
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return cursos;
	}

	public List<Integer> getCursosEstudiantes(int idEstudiante) {
		idCursos = new ArrayList<Integer>();
		String sql = "SELECT * FROM curso_estudiante WHERE id_estudiante="
				+ idEstudiante;
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);

		try {
			while (rs.next()) {
				System.out.println(rs.getInt("id_curso") + " ID_CURSO");
				idCursos.add(rs.getInt("id_curso"));

			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return idCursos;

	}

	public List<IEntidad> getCursosInscritosEstudiante(int idEstudiante) {
		cursos = new ArrayList<IEntidad>();
		seleccionCursosInscritosEstudiante = new ArrayList<Boolean>();
		String sql = "SELECT curso_estudiante.*,curso.*,estudiante.id_estudiante FROM curso_estudiante,curso,estudiante WHERE curso_estudiante.id_estudiante=estudiante.id_estudiante AND curso_estudiante.id_curso = curso.id_curso AND curso.estatus='ACTIVO' AND estudiante.id_estudiante ="
				+ idEstudiante;
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				seleccionCursosInscritosEstudiante.add(false);
				IEntidad curso = new Curso(rs.getInt("id_curso"), rs
						.getString("nombre"), rs.getString("descripcion"), rs
						.getInt("id_empleado"), rs.getString("estatus"), rs
						.getInt("id_ciclo"));

				cursos.add(curso);

			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return cursos;

	}

	public int eliminarRelacionCursoEstudianteInscrito(int idCurso,
			int idEstudiante) {
		int fila = 0;
		String sql = "DELETE FROM sistema_informacion.curso_estudiante WHERE id_curso = ? AND id_estudiante = ? ;";
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setInt(1, idCurso);
			stmt.setInt(2, idEstudiante);
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return fila;

	}

	public boolean isCursoSeleccionado(int idCurso) {
		boolean isChecked = false;
		for (int i : getIdCursos()) {

			if (i == idCurso) {
				isChecked = true;
			}
		}

		return isChecked;
	}

	public List<IEntidad> getEntidadDinamica(String parametro, int id) {
		cursos = new ArrayList<IEntidad>();
		String sql = "";
		if (parametro.equals("ACTIVO")) {
			sql = "SELECT * FROM sistema_informacion.curso WHERE estatus="
					+ "'" + parametro + "'" + " and id_empleado= " + id;

		} else if (parametro.equals("INACTIVO")) {
			sql = "SELECT * FROM sistema_informacion.curso WHERE estatus="
					+ "'" + parametro + "'" + " and id_empleado= " + id;

		} else if (parametro.equals("TODOS")) {
			sql = "SELECT * FROM sistema_informacion.curso where id_empleado= "
					+ id;
		}

		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);

		try {
			while (rs.next()) {
				IEntidad curso = new Curso(rs.getInt("id_curso"), rs
						.getString("nombre"), rs.getString("descripcion"), rs
						.getInt("id_empleado"), rs.getString("estatus"), rs
						.getInt("id_ciclo"));
				cursos.add(curso);

			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return cursos;
	}

	public List<Curso> getCursosPorProfesor(int id) {
		List<Curso> cursos = new ArrayList<Curso>();
		String sql = "SELECT * FROM curso WHERE id_empleado = " + id;
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				Curso curso = new Curso(rs.getInt("id_curso"), rs
						.getString("nombre"), rs.getString("descripcion"), rs
						.getInt("id_empleado"), rs.getString("estatus"), rs
						.getInt("id_ciclo"));
				cursos.add(curso);

			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return cursos;
	}

	public Curso getUltimpoCurso() {
		Curso curso = null;
		String sql = "SELECT * FROM curso order by id_curso DESC limit 1";
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				curso = new Curso(rs.getInt("id_curso"),
						rs.getString("nombre"), rs.getString("descripcion"), rs
								.getInt("id_empleado"),
						rs.getString("estatus"), rs.getInt("id_ciclo"));

			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return curso;
	}

	public List<Integer> getIdCursos() {
		return idCursos;
	}

	public List<Boolean> getSeleccionCursosInscritosEstudiante() {
		return seleccionCursosInscritosEstudiante;
	}

	public List<Boolean> getSeleccionCursosActivosNoInscritosPorEstudiante() {
		return seleccionCursosActivosNoInscritosPorEstudiante;
	}

	@Override
	public int agregarEmpleadoConCelular(IEntidad entidad) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public List<IEntidad> getEntidad() {
		// TODO Auto-generated method stub
		return null;
	}
	
	public Curso getCursoPorHorario(int idHorario) {
		Curso curso = null;
		String sql = "SELECT curso.* FROM curso, horario, horario_curso WHERE curso.id_curso = horario_curso.id_curso AND horario.id_horario = horario_curso.id_horario AND horario.id_horario = "
				+ idHorario;
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				curso = new Curso(rs.getInt("id_curso"),
						rs.getString("nombre"), rs.getString("descripcion"), rs
								.getInt("id_empleado"),
						rs.getString("estatus"), rs.getInt("id_ciclo"));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return curso;

	}

}
